# 导入:
from collections import OrderedDict
from goods.models import GoodsChannel, SKU
from django import http

def get_breadcrumb(category):
    """
    封装面包屑导航代码:
    :param category: 商品类别
    :return: 面包屑导航字典
    """

    # 定义一个字典:
    breadcrumb = {
        'cat1': '',
        'cat2': '',
        'cat3': ''
    }
    # 判断 category 是哪一个级别的.
    # 注意: 这里的 category 是 GoodsCategory对象
    if category.parent is None:
        # 当前类别为一级类别
        breadcrumb['cat1'] = category.name
    # 因为当前这个表示自关联表, 所以关联的对象还是自己:
    elif category.goodscategory_set.count() == 0:
        # 当前类别为三级
        breadcrumb['cat3'] = category.name
        cat2 = category.parent
        breadcrumb['cat2'] = cat2.name
        breadcrumb['cat1'] = cat2.parent.name
    else:
        # 当前类别为二级
        breadcrumb['cat2'] = category.name
        breadcrumb['cat1'] = category.parent.name

    return breadcrumb

def get_goods_and_spec(sku_id):

    # ======================== 获取该商品和该商品对应的规格选项id ===================================
    try:
        # 根据 sku_id 获取该商品(sku)
        sku = SKU.objects.get(id=sku_id)
        # 获取该商品的所有图片
        sku.images = sku.skuimage_set.all()
    except Exception as e:
        return http.JsonResponse({'code':400,
                                  'errmsg':'获取数据失败'})
    # 面包屑导航信息中的频道
    goods = sku.goods

    # 获取该商品的所有规格: [颜色, 内存大小, ...]
    sku_specs = sku.skuspecification_set.order_by('spec_id')

    sku_key = []
    # 根据该商品的规格(例如颜色), 获取对应的规格选项id(例如黑色id)
    # 保存到 [] 中
    for spec in sku_specs:
        sku_key.append(spec.option.id)

    # ============================ 获取类别下所有商品对应的规格选项id================================

    # 获取该商品的类别(spu,这里的spu就是goods)
    goods = sku.goods

    # 获取该类别下面的所有商品
    skus = goods.sku_set.all()

    dict = {}
    for sku in skus:
        # 获取每一个商品(sku)的规格参数
        s_specs = sku.skuspecification_set.order_by('spec_id')

        # 根据该商品的规格(例如颜色), 获取对应的规格选项id(例如黑色id)
        # 保存到 [] 中  获取一个商品
        key = []
        for spec in s_specs:
            key.append(spec.option.id)

        # 把 list 转为 () 拼接成 k : v 保存到dict中:
        dict[tuple(key)] = sku.id

    # ============================ 在每个选项上绑定对应的sku_id值 ===================================
    goods_specs = goods.goodsspecification_set.order_by('id')

    if len(sku_key) < len(goods_specs):
        return
        # enumerate (index 下标, spec 元素)
    for index, spec in enumerate(goods_specs):
        # 复制当前sku的规格键
        key = sku_key[:]
        # 该规格的选项,颜色
        spec_options = spec.specificationoption_set.all()
        # spec_options = spec.options.all()
        for option in spec_options:
            # 在规格参数sku字典中查找符合当前规格的sku
            key[index] = option.id   #赋值key
            option.sku_id = dict.get(tuple(key))

        spec.spec_options = spec_options

    data = {
        'goods': goods,
        'goods_specs': goods_specs,
        'sku': sku
    }

    return data

def get_categories():

    # =====================生成上面字典格式数据=======================
    # 第一部分: 从数据库中取数据:
    # 定义一个有序字典对象
    categories = OrderedDict()

    # 对 GoodsChannel 进行 group_id 和 sequence 排序, 获取排序后的结果:
    channels = GoodsChannel.objects.order_by('group_id', 'sequence')

    # 遍历排序后的结果: 得到所有的一级菜单( 即,频道 )
    for channel in channels:
        # 从频道中得到当前的 组id
        group_id = channel.group_id

        # 判断: 如果当前 组id 不在我们的有序字典中:
        if group_id not in categories:
            # 我们就把 组id 添加到 有序字典中
            # 并且作为 key值, value值 是 {'channels': [], 'sub_cats': []}
            categories[group_id] =  {'channels': [], 'sub_cats': []}

        # 获取当前频道的分类名称
        cat1 = channel.category

        # 给刚刚创建的字典中, 追加具体信息:
        # 即, 给'channels' 后面的 [] 里面添加如下的信息:
        categories[group_id]['channels'].append({
            'id': cat1.id,
            'name': cat1.name,
            'url': channel.url
        })

        # 根据 cat1 的外键反向, 获取下一级(二级菜单)的所有分类数据, 并遍历:
        for cat2 in cat1.goodscategory_set.all():
            # 创建一个新的列表:
            cat2.sub_cats = []
            # 根据 cat2 的外键反向, 获取下一级(三级菜单)的所有分类数据, 并遍历:
            for cat3 in cat2.goodscategory_set.all():
                # 拼接新的列表: key: 二级菜单名称, value: 三级菜单组成的列表
                cat2.sub_cats.append(cat3)
            # 所有内容在增加到 一级菜单生成的 有序字典中去:
            categories[group_id]['sub_cats'].append(cat2)
    return categories